/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.ieslaferreria.creditsintesis.builders;

import java.util.ArrayList;

/**
 *
 * @author Administrador
 * Esta clase contiene las piezas del mapa y es capaz de crear el mapa de alturas con ellas,
 * y devolverlo montado a nuestro gusto.
 */
public class PiecesOfMap {
    public static int STRAIGHT_LINE = 0;
    public static int CURVE_RIGHT = 1;
    public static int T_CHUNK = 2;
    public static int CROSS_FOUR_WAYS = 3;
    public static int SQUARE_FOUR_WAYS = 4;
    public static int PLAIN_0 = 5;
    public static int PLAIN_MAX = 6;
    public static int PRUEBASBORRAR = 7;
    public static int G_0 = 0;
    public static int G_90 = 1;
    public static int G_180 = 2;
    public static int G_270 = 3;





    private static final float Y =  (float) 1.5;
    private static final float X = 10;
    private static final float O = 1;

    ArrayList<float[]> Pieces = new ArrayList();

    /*Therse are the different pieces to made the map as a puzzle*/

    private float[] P_FOUR_WAYS=new float[]{
        /*                  1
        /*0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,
/*    3*/ X,X,X,X,X,O,O,O,O,O,O,Y,X,X,X,X,X,
/*    4*/ X,X,X,X,X,O,O,O,O,O,O,Y,X,X,X,X,X,
/*    5*/ O,O,Y,X,X,Y,O,O,O,O,O,Y,X,O,X,X,O,
/*    6*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    7*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    8*/ O,O,X,X,X,Y,O,O,O,O,O,Y,X,X,O,O,O,
/*    9*/ O,X,X,X,X,Y,O,O,O,O,O,X,X,X,X,X,O,
/*   10*/ X,X,X,X,X,Y,O,O,O,O,O,X,X,X,X,X,X,
/*   11*/ X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,
/*   12*/ X,X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,
/*   13*/ X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   15*/ X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X
};

        private float[] P_T=new float[]{
        /*                  1
        /*0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    3*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    4*/ X,X,Y,Y,Y,Y,Y,Y,X,X,Y,X,Y,X,X,X,X,
/*    5*/ O,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,O,O,O,O,
/*    6*/ O,Y,Y,X,X,X,Y,O,O,O,O,O,O,O,O,O,O,
/*    7*/ O,Y,Y,O,X,X,Y,O,O,O,O,O,O,O,O,O,O,
/*    8*/ O,Y,Y,O,X,X,Y,O,O,O,O,O,O,X,Y,O,O,
/*    9*/ O,O,Y,O,Y,X,Y,O,O,O,O,X,X,X,Y,O,O,
/*   10*/ X,Y,Y,O,Y,Y,Y,O,O,O,O,X,X,X,X,O,O,
/*   11*/ X,X,Y,O,Y,Y,O,O,O,O,O,X,X,X,X,X,X,
/*   12*/ X,Y,Y,Y,Y,O,O,O,O,O,X,X,X,X,X,X,X,
/*   13*/ X,Y,Y,Y,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   14*/ X,X,Y,Y,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   15*/ X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X
};

  private float[] P_RIGHT_CURVE=new float[]{
        /*                  1
        /*0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,O,Y,Y,Y,O,X,X,X,X,X,X,X,
/*    3*/ X,X,X,X,O,O,O,Y,O,O,O,X,X,X,X,X,X,
/*    4*/ X,X,X,X,X,O,O,Y,O,O,O,O,O,O,O,O,O,
/*    5*/ X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,
/*    6*/ X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,
/*    7*/ X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,O,O,
/*    8*/ X,X,X,X,X,X,O,O,O,O,O,O,X,O,O,O,O,
/*    9*/ X,X,X,X,X,X,O,O,O,O,O,X,X,X,O,O,O,
/*   10*/ X,X,X,X,X,X,O,O,O,O,O,X,X,X,X,O,O,
/*   11*/ X,X,X,X,X,O,O,O,O,O,O,O,X,X,X,O,O,
/*   12*/ X,X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,
/*   13*/ X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*   15*/ X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X
};

  private float[] P_LINE=new float[]{
        /*                  1
        /*0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,X,
/*    1*/ X,X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,Y,O,O,O,O,O,X,X,X,X,X,X,
/*    3*/ X,X,X,X,Y,Y,O,O,O,O,O,O,X,X,X,X,X,
/*    4*/ X,X,X,Y,Y,Y,O,O,O,O,O,O,X,X,X,X,X,
/*    5*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*    6*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*    7*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*    8*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*    9*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*   10*/ X,X,X,Y,Y,X,X,O,O,O,O,O,X,X,X,X,X,
/*   11*/ X,X,X,Y,Y,X,O,O,O,O,O,O,X,X,X,X,X,
/*   12*/ X,X,X,Y,Y,Y,O,O,O,O,O,X,X,X,X,X,X,
/*   13*/ X,X,X,Y,Y,O,O,O,O,O,O,X,X,X,X,X,X,
/*   14*/ X,X,X,Y,Y,O,O,O,O,O,O,X,X,X,X,X,X,
/*   15*/ X,X,X,X,X,X,O,O,O,O,O,O,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,X,O,O,O,O,O,O,X,X,X,X
};

  private float[] P_PRUEBASBORRAR=new float[]{
        /*                  1
        /*0 1 2 3 5 4 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    3*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,X,X,X,O,O,O,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,X,X,O,O,O,O,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,X,O,O,O,O,O,
/*   14*/ X,X,X,X,X,O,O,X,X,X,X,O,O,O,O,O,O,
/*   14*/ X,X,X,X,X,O,O,X,X,X,O,O,O,O,O,O,O,
/*   14*/ X,X,X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,
/*   14*/ X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,
/*   14*/ X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,O,O,
/*   14*/ X,X,X,X,X,X,X,O,O,O,O,O,O,O,O,X,X,
/*   14*/ X,X,X,X,X,X,X,O,O,O,O,O,O,O,X,X,X,
/*   14*/ X,X,X,X,X,X,X,O,O,O,O,O,O,O,X,X,20,
};

  private float[] P_PLAIN_MAX=new float[]{
        /*                  1
        /*0 1 2 3 5 4 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    3*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    4*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    5*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    6*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    7*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    8*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*    9*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   10*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   11*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   12*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   13*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   14*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   15*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X
};



  private float[] P_PLAIN_0=new float[]{
        /*                  1
        /*0 1 2 3 5 4 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    1*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    2*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    3*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    4*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    5*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    6*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    7*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    8*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    9*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   10*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   11*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   12*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   13*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   14*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   15*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   16*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O
};


  private float[] P_SQUARE=new float[]{
        /*                  1
        /*0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
/*    0*/ X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,X,
/*    1*/ X,X,X,X,O,O,O,O,O,X,X,X,X,X,X,X,X,
/*    2*/ X,X,X,Y,O,O,O,O,O,O,X,X,X,X,X,X,X,
/*    3*/ X,X,Y,Y,O,O,O,O,O,O,Y,Y,Y,X,X,X,X,
/*    4*/ X,X,Y,Y,O,O,O,O,O,O,Y,Y,Y,X,X,X,X,
/*    5*/ O,O,O,O,O,O,O,O,O,O,O,O,Y,Y,X,X,X,
/*    6*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*    7*/ O,O,O,O,O,O,Y,Y,O,O,O,O,O,O,O,O,O,
/*    8*/ O,O,O,O,O,O,Y,Y,O,O,O,O,O,O,O,O,O,
/*    9*/ O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   10*/ O,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   11*/ X,X,O,O,O,O,O,O,O,O,O,O,O,O,O,O,O,
/*   12*/ X,X,Y,Y,O,O,O,O,O,O,O,Y,Y,Y,X,O,O,
/*   13*/ X,X,Y,Y,O,O,O,O,O,O,O,Y,Y,Y,X,X,X,
/*   14*/ X,X,Y,Y,O,O,O,O,O,O,O,Y,Y,X,X,X,X,
/*   15*/ X,X,X,Y,O,O,O,O,O,O,O,O,X,X,X,X,X,
/*   16*/ X,X,X,X,X,X,O,O,O,O,O,X,X,X,X,X,X
};
       int size;
       float [] F_copy ;
       float [] S_copy;


   public PiecesOfMap(){
    this.size = 17;
     F_copy = new float[this.size*this.size];
     S_copy = new float[this.size*this.size];

       this.Pieces.add(this.P_LINE);
       this.Pieces.add(this.P_RIGHT_CURVE);
       this.Pieces.add(this.P_T);
       this.Pieces.add(this.P_FOUR_WAYS);
       this.Pieces.add(this.P_SQUARE);
       this.Pieces.add(this.P_PLAIN_0);
       this.Pieces.add(this.P_PLAIN_MAX);
       this.Pieces.add(this.P_PRUEBASBORRAR);

   }

 public float[] getPiece(int kindPiece,int Degree){

       if(Degree== G_0){
        return this.Pieces.get(kindPiece).clone();
       }else if(Degree == G_90){
       this.rotate90(this.Pieces.get(kindPiece).clone()  , size, 0);
        return this.F_copy;
       }else if(Degree == G_180){
       this.rotate180(this.Pieces.get(kindPiece).clone()  ,size);
        return this.S_copy;
       }else if(Degree == G_270){
       this.rotate270(this.Pieces.get(kindPiece).clone()  ,size);
        return this.F_copy;
       }else{
           return this.P_FOUR_WAYS;
       }


   }


    public void rotate180(float []p, int n){
      this.rotate90(p, n,0);
      this.rotate90(this.F_copy, n,1);

    }
     public void rotate270(float []p, int n){

       this.rotate90(p, n,0);
       this.rotate90(this.F_copy, n,1);
       this.rotate90(this.S_copy, n,0);

     }


   public void  rotate90(float []p, int n,int t){
       int cont = 0;
       int pos1=n-1;
       int k = 0;


       while(pos1>=0){

           while(k<n){
               if(t==0){
           this.F_copy[cont]=p[(k*n+pos1)];
               }else if(t!=0){
           this.S_copy[cont]=p[(k*n+pos1)];
               }

           k++;
           cont++;
           }
           k=0;
           pos1--;
       }

   }
 public int getRealRow(int numBlockF,int sizeMap,int fila){
       return numBlockF*((this.size-1) * sizeMap)+(fila*sizeMap);
   }

   public int getRealColumn(int numBlockC,int sizeMap,int column){
       return (numBlockC*(this.size-1))+column ;
   }

   public int getRealPos(int blokR,int blokC,int row,int column,int sizeMap){

       return (this.getRealRow(blokR, sizeMap,row))+(this.getRealColumn(blokC, this.size,column));

   }
   public void addNewPieceOnMap (float [] map ,int piece,int degree, int numBloqueF, int numBloqueC, int sizeMap){

       int c = 0;
       int f = 0;
//       int blokSize;
       int ff = 0;
       int cc = 0;
       float[] pieceToAdd = this.getPiece(piece,degree);

       if(numBloqueF < sizeMap/(size-1)){ /*mirar si esta en la ultima fila*/
           ff = 1;
       }else{
           ff=0;
       }
       if(numBloqueC < sizeMap/(size-1)){ /*mirar si esta en la ultima fila*/
           cc = 1;
       }else{
           cc=0;
       }

       //blokSize=(size+ff)*(size+ff);

       while(f<size-ff){

           while(c<size-cc){

                map[getRealPos(numBloqueF, numBloqueC, f, c, sizeMap)]= pieceToAdd[f*size+c];
//                System.out.print(map[getRealPos(numBloqueF, numBloqueC, f, c, sizeMap)]);
//                System.out.print(",");
                c++;
           }
//           System.out.println("\n");
           c=0;

           f++;
           }
/*con el primer while pretendo repetir hasta acabar la pieza
 grabar la primera fila de la pieza alla donde le corresponde en el mapa grande
 * con el segundo while lo que hago es saltar de linea del mapa grande y grabar las siguientes lineas debajo de
 la primera*/
/*
       while(incr<=this.size*this.size){

       while(cont<size){
       this.map[realCoord+incr]= pieceToAdd[incr];

       incr++;
       cont++;
       }
       cont=0;
       realCoord=realCoord+totalSizeMap-size;/*salto de linea de el vector mapa grande

       }

*/
   }


}
